package controllers;

import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import javax.faces.context.ExternalContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import modelo.Persona;
import modelo.Usuario;
import services.PersonaService;
import services.UsuarioService;

@ManagedBean(name = "usuarioBean")
@SessionScoped
public class UsuarioBean implements Serializable {


	private static final long serialVersionUID = -3219781222562395439L;

	private Usuario usuario;
    private UsuarioService serviceUsuario;
    private boolean logeado = false;
    private boolean admin = false;
    private boolean propietario = false;
    private String nombreUsuario;

	public UsuarioBean() {
		super();
		serviceUsuario=new UsuarioService();
		usuario=new Usuario();
	}

	  public boolean estaLogeado() {
		    return logeado;
		  }
	
	public void doLogin() throws NoSuchAlgorithmException  {
		
		RequestContext context = RequestContext.getCurrentInstance();
		
		MessageDigest md = null;
		String password = usuario.getContrasenia();
		// encripta la password
		md= MessageDigest.getInstance("MD5");
        md.update(password.getBytes());
        byte[] digest = md.digest();
		StringBuffer sb = new StringBuffer();
		for (byte b : digest) {
			sb.append(String.format("%02x", b & 0xff));
		}
        usuario.setContrasenia(sb.toString());
        
        boolean resultado = serviceUsuario.validarUsuario(usuario);
        
        if (resultado) {
            usuario = serviceUsuario.obtenerUsuario(usuario);
        	logeado = true;
        	FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Bienvenido!",	usuario.getPersona().getNombre()));        	
            //return "home";
        } else {
        	logeado = false;
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "Login Invalido!",
                    "Por favor intentelo de nuevo!"));
            //return "login";
        }

        context.addCallbackParam("estaLogeado", logeado);
   	
        
  		if (logeado)
  		{
  	        FacesContext context1 = FacesContext.getCurrentInstance();
  	    	HttpSession session;
  		    session = (HttpSession) context1.getExternalContext().getSession(true);
  		    session.setAttribute("id", usuario.getIdUsuario());
  		    session.setAttribute("username", usuario.getNombreUsuario());
  		    session.setAttribute("perfil", usuario.getPerfil().getIdPerfil());
  		    session.setAttribute("persona", usuario.getPersona().getIdPersona());
  		    session.setAttribute("usuarioBean", this);
  		    System.out.println("Session id: " + session.getId());	
  		    Integer perfil = usuario.getPerfil().getIdPerfil();
  			this.nombreUsuario = usuario.getPersona().getNombre();
  		    if (perfil==2)
  		    	{context.addCallbackParam("view", "/EventosCompartidos/template/modelo/home.xhtml");
  		    	admin = false;
  		    	propietario=true;
  		    	}
  		    	else {
  		    		if(perfil==1)
  		    		{
  		    			context.addCallbackParam("view", "/EventosCompartidos/template/modelo/home.xhtml");	
  		    			admin = true;
  		    			propietario=false;
  		    	    }
  		    	    else
  		    	    {
  		    	    	context.addCallbackParam("view", "/EventosCompartidos/template/modelo/SalonesWeb.xhtml");
  		         	}
  		    	}
          
  		}
        
	}

	  public void logout() {
		    HttpSession session = (HttpSession) FacesContext.getCurrentInstance() 
		                                        .getExternalContext().getSession(false);
		    session.invalidate();
		    logeado = false;
		  }
	
	public String registrarNuevoUsuario() {

		return "nuevo";
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public UsuarioService getServiceUsuario() {
		return serviceUsuario;
	}

	public void setServiceUsuario(UsuarioService serviceUsuario) {
		this.serviceUsuario = serviceUsuario;
	}

	public boolean isLogeado() {
		return logeado;
	}


	public void setLogeado(boolean logeado) {
		this.logeado = logeado;
	}

	public String getNombreUsuario() {
		return nombreUsuario;
	}

	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}

	public boolean isAdmin() {
		return admin;
	}

	public void setAdmin(boolean admin) {
		this.admin = admin;
	}

	public boolean isPropietario() {
		return propietario;
	}

	public void setPropietario(boolean propietario) {
		this.propietario = propietario;
	}


}
